Как записать или сохранить массив строк в файле .txt в java - PullRequest
2 голосов
/ 07 мая 2020

Я хочу записать строковый массив в файл .txt. Но после запуска кода я получаю пустой файл. Вот мой код.

public void DataSave() throws IOException {
        File fout = new File("Data.txt");
        FileOutputStream fos = new FileOutputStream(fout);

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

        String[] numberOfProperty = new String[3];
        numberOfProperty[0] = "1";
        numberOfProperty[1] = "3";
        numberOfProperty[2] = "4";
        for (int i = 0; i < numberOfProperty.length; i++) {
            bw.write(numberOfProperty[i]);
            bw.newLine();
        }
    }

Что не так в моем коде, я не могу понять. Компилятор не показывает ошибок. Пожалуйста помоги. Все ответы будут оценены.

Ответы [ 3 ]

5 голосов
/ 07 мая 2020
public void DataSave() {
    File fout = new File("Data.txt");
    try (FileOutputStream fos = new FileOutputStream(fout); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));) {
        String[] numberOfProperty = new String[3];
        numberOfProperty[0] = "1";
        numberOfProperty[1] = "3";
        numberOfProperty[2] = "4";
        for (String s : numberOfProperty) {
            bw.write(s);
            bw.newLine();
        }
    } catch (IOException ignored) {

    }
}

Нужно закрыть BufferedReader. Лучшее решение - использовать try-with-resources, поэтому вам не нужно беспокоиться о закрытии.

У вас может быть несколько ресурсов в try-with-resources, разделенных ;.


Java 13+, вы можете использовать Path.of () :

public void DataSave() {
    File fout = new File("Data.txt");
    try (FileOutputStream fos = new FileOutputStream(fout); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));) {
        String[] numberOfProperty = new String[3];
        numberOfProperty[0] = "1";
        numberOfProperty[1] = "3";
        numberOfProperty[2] = "4";
        Files.write(Path.of("Data.txt"), Collections.singletonList(numberOfProperty));
    } catch (IOException ignored) {

    }
}

Вы также можете записать свой массив в одну строку как:

String[] numberOfProperty = {"1", "2", "3"};
1 голос
/ 07 мая 2020

Первое, что я понял, это название вашего метода, попробуйте использовать верблюжий кожух. Вместо DataSave () попробуйте dataSave () для получения дополнительной информации о соглашениях об именах см. Эту ссылку: https://www.javatpoint.com/java-naming-conventions

Во-вторых, при использовании ресурсов java для чтения и записи в файлы убедитесь, что закрыть ресурс по окончании обработки. Вы можете увидеть больше информации здесь: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

См. Мой пример ниже с оператором try-with-resource.

public void dataSave() {

    File fout = new File("data.txt");

    String[] numberOfProperty = new String[3];
    numberOfProperty[0] = "1";
    numberOfProperty[1] = "3";
    numberOfProperty[2] = "4";

    try (FileWriter fileWriter = new FileWriter(fout);
         BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)){

        for(String str: numberOfProperty)
        {
            bufferedWriter.write(str);
            bufferedWriter.newLine();

        }
    } catch (FileNotFoundException e) {
        System.out.println("Unable to open file, file not found.");
    } catch (IOException e) {
        System.out.println("Unable to write to file." + fout.getName());

    }

    }
0 голосов
/ 19 мая 2020

Вот еще одно решение, использующее Apache Camel route и StringUtils Spring Framework.

Класс имеет полезный метод: StringUtils.collectionToDelimitedString(list, delimiter), который выполняет большую часть logi c.

Обратите внимание, что вы также можете использовать класс Spring StringUtils без Camel.

Вот модульный тест, демонстрирующий решение:

package test.unit.camel;

import org.apache.camel.Endpoint;
import org.apache.camel.EndpointInject;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.commons.io.FileUtils;
import org.hamcrest.Matchers;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.springframework.util.StringUtils;

import java.io.File;
import java.util.List;

public class StringToTextFileTest extends CamelTestSupport {

@EndpointInject(uri = "direct:in")
private Endpoint in;

@EndpointInject(uri = "mock:error")
private MockEndpoint error;

@Test
public void testString() throws Exception {
    error.expectedMessageCount(0);

    String[] numberOfProperty = new String[3];
    numberOfProperty[0] = "1";
    numberOfProperty[1] = "3";
    numberOfProperty[2] = "4";

/*
    // This test the entry with a collection instead an array.
    List<String> numberOfProperty = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        numberOfProperty.add(String.valueOf(i+1));
    }
*/
    template.sendBody(in, numberOfProperty);
    assertMockEndpointsSatisfied();

    File[] files = testFolder.getRoot().listFiles();
    assertThat(files.length, Matchers.greaterThan(0));
    File result = files[0];
    assertThat(result.getName(), Matchers.is("file.txt"));

    String resultStr = FileUtils.readFileToString(result);
    log.info("Result string is: {}", resultStr);
}

@Override
protected RouteBuilder createRouteBuilder() throws Exception {

    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {

            //@formatter:off

            onException(Exception.class)
                .to("mock:error");

            from(in.getEndpointUri())
                .process(processBody())
                .to("file:" + testFolder.getRoot().getAbsolutePath() + "?fileName=file.txt")
            ;
            //@formatter:on
        }

        private Processor processBody() {
            return exchange -> {
                // Camel automatically converts arrays to Collection if needed. 
                List<String> list = exchange.getIn().getBody(List.class);
                String body = StringUtils.collectionToDelimitedString(list, "\n");
                exchange.getIn().setBody(body);
            };
        }
    };
}

@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
}
...