2016-05-09 1 views
0

Я попытался прочитать из текстового файла, используя DataInputStream и FileInputStream. Я знаю, что я должен использовать FileReader, но я хотел попробовать его с потоками Byte.Почему я получаю исключение EOF только тогда, когда читаю из созданного мной файла?

здесь код

import java.io.*; 

public class FTest_3 { 

public static void main(String[] args) throws IOException{ 
    DataInputStream stream = new DataInputStream(new FileInputStream("lol1.txt")); 
    String str = stream.readUTF(); 
    System.out.println(str); 
    stream.close(); 
} 
} 

Если я пытаюсь читать из файла lol1.txt, получая EOF Exception и readUTf(unknownsource) ошибки.

Но если я создам файл lol1.txt используя DataOutputStream, а затем прочитайте его, используя приведенный выше код, он отлично работает.

Вот мой код, чтобы записать файл

import java.io.*; 

public class FTest_4 { 

public static void main(String[] args) throws IOException{ 
    DataOutputStream stream = new DataOutputStream(new FileOutputStream("lol1.txt")); 
    stream.writeUTF("hahah"); 
    stream.close(); 
} 
} 

Кроме того, я не мог найти любую соответствующую запись, которая может ответить на мой запрос. Спасибо!

+1

так как вы создаете файл изначально? –

+0

DataOutputStream использует определенный формат файла. Вы не можете создать файл другим способом и ожидать, что сможете его прочитать. В частности, вы не можете читать с ним текстовые файлы. – Thilo

+0

«Я хотел попробовать его с потоками байтов». Ну, тогда сделай это. DataInputStream не является байтовым потоком. Для необработанных байтов напрямую используйте FileInputStream. – Thilo

ответ

1

readUTF является not a general-purpose method to read Strings from text files.

Сначала он считывает два байта, которые должны содержать количество последующих байтов данных (байты, а не символы). После этого появятся байты для строки в модифицированной кодировке UTF-8.

В вашем случае вы, вероятно, читали два символа ASCII «ha» (0x68 0x61) в начале вашего файла, что является довольно большим числом, когда оно интерпретируется как целое число, а затем получило EOF, потому что были недостаточно файлов, оставшихся в файле, чтобы соответствовать этому.

Чтобы прочитать необработанные байты, используйте один из методов InputStream#read.

Для чтения текстовых файлов используйте Reader, а не InputStream. Затем вы также можете прочитать строки.

+0

Большое спасибо! –

0

Попробуйте использовать stream.read(); для чтения из текстового файла с использованием DataInputStream или для определенных значений попробуйте использовать stream.readDouble(), stream.readInt() и т. д. и аналогичным образом попытайтесь использовать stream.write() для записи в текстовый файл с использованием DataOutputStream.