Вопрос по file, java – Java: чтение байтов из файла .txt LINE BY LINE

0

Пожалуйста, посмотрите на следующий код

    import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class FileCopy2
{    public static void main(String[]args) 
    {        
        try
        {

              //First in here, we are trying to get the bytes from the file


        File file = new File("D:/burn/preview.mp3"); //The File you need to get

        byte bufferFile[] = new byte[(int)file.length()]; //Creating a byte array, which has the exact size of the file

        BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file));// Creating Buffers for IO

        bi.read(bufferFile, 0, bufferFile.length);//Reading the file

        bi.close();//Closing Buffer




        //Then in here, we are writing those bytes to a text file

        BufferedOutputStream bu = new BufferedOutputStream(new FileOutputStream("C:/Users/Yohan/Desktop/test.txt")); //The output Location
        bu.write(bufferFile, 0, bufferFile.length);//Writing the file
        bu.flush();//Flushing the buffer
        bu.close();//Closing the Buffer

        System.out.println("Done Copieng");



        //Here we are trying to WRITE number of .txt files containing the byte details..In other words, I am breaking the file into peaces

        BufferedReader br = new BufferedReader(new FileReader("C:/Users/Yohan/Desktop/test.txt"));
        BufferedWriter bw = null;

        String content = "";
        int count = 1;
        while((content = br.readLine())!=null)
        {

            bw = new BufferedWriter(new FileWriter("C:/Users/Yohan/Desktop/output4/file"+count+".txt"));
            bw.write(content);
            bw.flush();
            bw.close();


            count++;
            System.out.println("Running");

        }
        System.out.println("-----------------------Done-----------------------------");



            //NOW I NEED TO read all the generated .txt file and create the original file back. How to do it? //
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

Там я сначала получаю байты файла и записываю их в текстовый файл. Затем я читаю этот текстовый файл, читаю построчно и генерирую отдельный файл .txt для каждой строки.Now the original program is split into thousands of files, Теперь мне нужно прочитать все файлы .txt и сгенерировать файл .txt. Я не знаю, как сделать последнее. Как я могу это сделать? Пожалуйста помоги!

То, что вы можете преобразовать любую последовательность закодированных символов в последовательность байтов, не означает, что вы можете преобразовать любую последовательность байтов в действительную последовательность закодированных символов. Ваша программа не имеет смысла, и нет правильного ответа на ваш вопрос. Предположим, ваша кодировка ASCII, которая рассматривает все байты от 128 до 255 как недопустимые символы. Вы пытаетесь преобразовать mp3-файл, содержащий такие байты, в ASCII, и таким образом вы потеряете половину байтов вашего mp3-файла. JB Nizet
@Polygnome: каковы ваши ответы? PeakGen
@JBNizet: я знаю, что он содержит двоичные данные и поэтому получил байты. Если вы измените параметры файла (что означает «C» /Users/Yohan/Desktop/test.txt" первый блок и «D: /burn/preview.mp3" второй блок») после запустить этот код первым. Это восстановит оригинальный файл, я проверил это, и это работало все время. Пожалуйста, будьте любезны предоставить ответ, если знаете PeakGen
Эта программа не имеет смысла. Файл mp3 содержит двоичные данные, а не текстовые данные. Нет смысла писать и читать это как текст. Более того, у вас нет абсолютно никаких гарантий, что вы прочитали весь файл, так как вы игнорируете результат вызова read () и не выполняете цикл, пока не прочитаете все. И, наконец, вы не закрываете свои потоки в блоках finally. Google для "Учебник по Java IO". JB Nizet
Если вы изменили спецификацию только на текстовый файл, то для ввода и amp; вывод, люди могли бы дать ответы. Даже учитывая, что то, что вы будете делать, не имеет особого смысла. Зачем разбирать файл в каждую строку, только чтобы собрать его? Какую функцию программы вы пытаетесь предложить через все эти усилия? Andrew Thompson

Ваш Ответ

1   ответ
10

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

Вот пример способа, который считывает файл и разбивает его на части по 1024 байта, записанные в N выходных файлов:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileSplit {
    public static void main(String[] args) throws IOException {
        new FileSplit().splitFile(new File(args[0]));
    }

    private void splitFile(File file) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        try {
            byte[] buffer = new byte[1024];
            // remaining is the number of bytes to read to fill the buffer
            int remaining = buffer.length; 
            // block number is incremented each time a block of 1024 bytes is read 
            //and written
            int blockNumber = 1;
            while (true) {
                int read = fis.read(buffer, buffer.length - remaining, remaining);
                if (read >= 0) { // some bytes were read
                    remaining -= read;
                    if (remaining == 0) { // the buffer is full
                        writeBlock(blockNumber, buffer, buffer.length - remaining);
                        blockNumber++;
                        remaining = buffer.length;
                    }
                }
                else { 
                    // the end of the file was reached. If some bytes are in the buffer
                    // they are written to the last output file
                    if (remaining < buffer.length) {
                        writeBlock(blockNumber, buffer, buffer.length - remaining);
                    }
                    break;
                }
            }
        }
        finally {
            fis.close();
        }
    }

    private void writeBlock(int blockNumber, byte[] buffer, int length) throws IOException {
        FileOutputStream fos = new FileOutputStream("output_" + blockNumber + ".dat");
        try {
            fos.write(buffer, 0, length);
        }
        finally {
            fos.close();
        }
    }
}
Error: User Rate Limit Exceeded PeakGen
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded PeakGen

Похожие вопросы