Скопируйте содержимое из одного файла в несколько файлов, используя Java - PullRequest
0 голосов
/ 23 июня 2018
FileInputStream Fread = new FileInputStream("somefilename"); 
FileOutputStream Fwrite = null;

for (int i = 1; i <= 5; i++)
{
    String fileName = "file" + i + ".txt";
    Fwrite = new FileOutputStream(fileName);
    int c; 

    while ((c = Fread.read()) != -1) 
    {
        Fwrite.write((char) c);
    }

    Fwrite.close();
}

Fread.close();

Приведенный выше код записывает только в один файл.Как сделать так, чтобы содержимое одного файла записывалось в несколько файлов?

Ответы [ 4 ]

0 голосов
/ 23 июня 2018

К вашему сведению: Обратите внимание, что использованный метод read() возвращает byte, а не char, поэтому вызов write((char) c) должен был быть просто write(c).


Для параллельной записи в несколько файлов при копировании файла вы создаете массив выходных потоков для файлов назначения, а затем выполняете итерацию массива, чтобы записать данные во все из них.

Для лучшей производительности вы всегда должны делать это, используя буфер. Запись одного байта за раз не будет хорошо работать.

public static void copyToMultipleFiles(String inFile, String... outFiles) throws IOException {
    OutputStream[] outStreams = new OutputStream[outFiles.length];
    try {
        for (int i = 0; i < outFiles.length; i++)
            outStreams[i] = new FileOutputStream(outFiles[i]);
        try (InputStream inStream = new FileInputStream(inFile)) {
            byte[] buf = new byte[16384];
            for (int len; (len = inStream.read(buf)) > 0; )
                for (OutputStream outStream : outStreams)
                    outStream.write(buf, 0, len);
        }
    } finally {
        for (OutputStream outStream : outStreams)
            if (outStream != null)
                outStream.close();
    }
}
0 голосов
/ 23 июня 2018

Добавить эту строку:

Fread.reset();

после Fwrite.close();

И измените первую строку кода следующим образом:

InputStream Fread = new BufferedInputStream(new FileInputStream("somefilename"));
Fread.mark(0);
0 голосов
/ 23 июня 2018

Поток FRead доходит до конца один раз, и тогда уже нечего начинать с самого начала. Для решения этой проблемы вы можете:

  • вызов FRead.reset() после каждой записи файла
  • кэшируйте FRead значение где-нибудь и пишите FWrite из этого источника
  • создать массив / коллекцию FileOutputStream и записать каждый байт во все итерации

Рекомендуемое решение, конечно, первое.

Также в вашем коде есть некоторые проблемы:

  • Мы настоятельно рекомендуем использовать try-with-resouce для потоков, поскольку они должны быть надежно закрыты
  • Вы, похоже, не следуете соглашениям по присвоению имен, которые говорят, чтобы именовать переменные в lowerCamelCase
0 голосов
/ 23 июня 2018

Вам нужно будет создать несколько экземпляров FileOutputStream fwrite1, fwrite2, fwrite3, по одному на каждый файл, в который вы хотите записать, затем, когда вы читаете, вы просто пишете всем им. Вот как ты этого добиваешься.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...