2016-11-04 3 views
-1

Для записи строки данных в файл с использованием fileoutputstream мы переходим для преобразования строки в байтовый массив. Для чтения строки данных с использованием fileinputstream мы не можем использовать преобразование. В чем причина этого?downcasting и upcasting в java-файле io?

чтение:

class Test { 
    public static void main(String args[]) { 
    try { 
     Fileinputstream fin = new Fileinputstream("abc.txt"); 
     int i = 0; 
     while ((i = fin.read()) != -1) { 
     System.out.print((char) i); 
     } 
     fin.close(); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
    } 
} 

записывания:

class Test { 
    public static void main(String args[]) { 
    try { 
     FileOutputstream fout = new FileOutputStream("abc.txt"); 
     String s = "Sachin Tendulkar is my favourite player"; 
     byte b[] = s.getBytes(); //converting string into byte array 
     fout.write(b); 
     fout.close(); 
     System.out.println("success..."); 
    } catch (Exception e) { 
     system.out.println(e); 
    } 
    } 
} 
+1

Неясно, что вы имеете в виду. Просьба привести пример. –

+1

Что вы имеете в виду? FileInputStream имеет метод чтения (byte []), который считывает из файла в байт []. Преобразование этого в строку тривиально (есть конструктор в String) –

+1

@MattFellows «Преобразование этого в строку тривиально» тривиально, но легко сделать неправильно. –

ответ

-1

FileInputStream читает только примитивные значения и FileOutputStream пишет только примитивные значения (и массивы этих примитивов).
String имеет конструктор для byte[] и способ, чтобы получить byte[] своих данных, нет несоответствием здесь ...

String s = new String("The Data"); 
byte[] bytesToWrite = s.getBytes(); 
FileOutputStream fos = new FileOutputStream(file); 
fos.write(bytesToWrite); 

против

FileInputStream fis = new FileInputStream(file); 
byte[] bytesRead = new byte[8]; 
fis.read(bytesRead); 
String s2 = new String(bytesRead); 

EDIT: Этот код не является безопасным, не является лучшей практикой и ни при каких обстоятельствах не должна использоваться. Это просто демонстрирует симметрию между входными и выходными потоками. Фактически, если вы имеете дело с потоками самостоятельно, вы можете захотеть использовать библиотеку для обработки буферизации, чтения правильного количества байтов и т. Д. Для вас. Я настоятельно рекомендую Apache Commons IOUtils проект такого рода вещи ...

+0

Первый пример, который я дал, способен читать строку символов? –

+0

Я думаю, что он читает один символ каждый раз, а не полную строку ...... Я правильно? –

+0

Вы должны действительно направлять пользователя на использование читателей/писателей для чтения/записи символов, а не для использования потоков. –

-1

Вы могли бы сделать его похожим на этого примера:

Читать все байты и преобразовать его в одну строку:

try (FileInputStream fis = new FileInputStream("file.txt")) { 
    final byte[] buffer = new byte[1024]; 
    int count; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    while ((count = fis.read(buffer)) != -1) { 
     bos.write(buffer, 0, count); 
    } 
    return new String(bos.toByteArray()); 
} 

Читать все строки в виде списка строк:

try (FileInputStream fis = new FileInputStream("file.txt"); 
     InputStreamReader isr = new InputStreamReader(fis); 
     BufferedReader reader = new BufferedReader(isr)) { 
    List<String> lines = new ArrayList<>(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     lines.add(line); 
    } 
    return lines; 
} 

Другие примеры и, возможно, некоторые рекомендации можно найти здесь: How do I create a Java string from the contents of a file?

+1

Ваш первый пример - действительно опасная реализация. Вы читаете байты в кусках произвольного размера и ожидаете, что сможете сделать строку из каждого фрагмента. Один из способов, которым это приведет к сбою, - это если многобайтовый символ разделен между двумя чтениями, выделение String из буфера неизбежно завершится неудачей. См. Этот вопрос (среди прочих): http://stackoverflow.com/questions/28969941/inputstream-and-utf-8-sometimes-shows-characters – GPI

+0

благодарит за информацию. Должно быть исправлено сейчас. –

+0

Согласен, эта конкретная проблема была адресована :-) – GPI