2013-06-03 7 views
0

У меня есть этот кусок кода, просто чтобы записать его в файл. Но когда я его компилирую, он не отображает никаких ошибок, но текст в моем файле нечитабелен, некоторые коды Unicode и т. Д. ... Я использую eclipse IDE. Что может быть причиной этого?Ошибка FileInputStream

public static void main(String[] args) { 

    String s = "Hello world!"; 
    int i = 143141141; 
    try 
    { 
     //create new file with an ObjectOutputStream 
     FileOutputStream out = new FileOutputStream("test.txt"); 
     ObjectOutputStream oout = new ObjectOutputStream(out); 

     //write something in a file 
     oout.writeObject(s); 
     oout.writeObject(i); 
     //close the stream 
     oout.close(); 

     //create an ObjectInputStream for the file we created before 
     ObjectInputStream ois = new ObjectInputStream(
               new FileInputStream("test.txt")); 
     //read and print what we wrote before 
     System.out.println("" + (String) ois.readObject()); 
     System.out.println("" + ois.readObject()); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 
+0

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

+0

Здесь нет текстового файла. Там файл сериализованных объектов. Нет оснований ожидать, что он будет читаемым человеком. Не настоящий вопрос. – EJP

+0

@EJP ObjectOutputStream преобразует объект в поток байтов. ObjectInputStream преобразует его обратно в Object (String) в этом случае и его работу. –

ответ

-1

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

Пробуйте приведенный ниже код.

public static void main(String[] args) { 

    String s = "Hello world!"; 
    int i = 143141141; 
    try 
    { 
     //create new file with an ObjectOutputStream 
     FileOutputStream out = new FileOutputStream("test.txt"); 
     ObjectOutputStream oout = new ObjectOutputStream(out); 

     //write something in a file 
     oout.writeObject(s); 
     oout.flush(); 
     oout.writeObject(i); 
     oout.flush();   
     //close the stream 
     out.close(); 
     oout.close(); 

     //create an ObjectInputStream for the file we created before 
     ObjectInputStream ois = new ObjectInputStream(new FileInputStream("test.txt")); 
     //read and print what we wrote before 
     System.out.println("" + (String) ois.readObject()); 
     System.out.println("" + ois.readObject()); 
     ois.close(); 
    } 
    catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

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

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

      String content = "This is the content to write into file"; 

      File file = new File("c:\\desktop\\filename.txt"); 

      // if file doesnt exists, then create it 
      if (!file.exists()) { 
       file.createNewFile(); 
      } 

      FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
      BufferedWriter bw = new BufferedWriter(fw); 
      bw.write(content); 
      bw.close(); 

      System.out.println("Done"); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

После этого вы можете открыть текстовый файл и может видеть написанное содержание в читабельной форме, и это хорошая практика, чтобы не дать «.txt» форматы, когда вы пишете объекты в файл. Это вводит в заблуждение.

Надеюсь, это поможет.

+0

Я не спустил вас вниз, но вы полностью закрываете свои потоки в неправильном порядке. – Sanchit

+0

@ Sanchit: Ну, я не вижу здесь ничего плохого. После записи в файл я закрываю FileOutputStream, а затем ObjectOutputStream. Вы можете указать на ошибку, если я ошибаюсь. – ankurtr

+0

Вы открываете. Затем откройте oout. Затем закройте. Затем закройте. Выглядит неправильно, кажется неправильным, вероятно, работает из-за oout.flush перед out.close, но это, вероятно, работает. Похоже, что этот код будет корчиться на вас, когда вы меньше всего этого ожидаете. Я бы рекомендовал закрывать потоки в том порядке, в котором вы их открываете. – Sanchit

0

Вы должны использовать PrintWriter для записи текстовых файлов, ObjectOutputStream записывает двоичные данные.

+0

Кроме того, ObjectInputStream считывает двоичные данные –

2

С помощью ObjectOutputStream вы используете Serialization, чтобы записать ваши объекты в файл. Сериализация использует систему кодирования, и вы правильно используете ObjectInputStream в своей программе для декодирования этих объектов. Но вы не сможете прочитать информацию в файле, созданном процессом Serialization.

+0

Он использовал то же самое .... Пожалуйста, посмотрите полный код –

+0

Извините, я исправил свой ответ. – eternay

2

Поскольку вы используете ObjectOutputStream и ObjectInputStream, он будет писать код объекта, который не читается, а так же, когда и чтение из файла, он придумает как объект, так же как объект,

Используйте BufferedReader или Writer для записи String в файл, который можно прочитать

FileReader f=new FileReader(new File("test.txt")); 
BufferedReader f1=new BufferedReader(f) 

;

+1

ObjectInputStream также преобразует эти сохраненные байты в Object –

+0

, отредактированный спасибо !! – anshulkatta

0

Java ObjectOuputStream записывает объекты в двоичном формате, не читаемом человеком, который может быть прочитан только с ObjectInputStream.

0

Ваш код работает отлично для меня. Если я правильно понимаю, когда смотрю содержимое файла, открывая его в редакторе (например, блокнот или затмение), вы видите символы, хранящиеся в нем как двоичный контент. При использовании ObjectInputStream и ObjectOutputStream поведение правильное.

0

Вы не записываете значения своих объектов String и Integer, но их представления объектов в двоичном формате. Это называется object-serialization. Это то, как закодировано представлять всю информацию ассоциированной с object не только ее value. Это отображается только при декодировании так же, как мы их закодировали. Таким образом, обычный text editor не может отображать информацию, как вы ожидали.

Если вы хотите сохранить только строковое представление, используйте классы, такие как PrintWriter.

0

Я пробовал свой код. Это отлично работает для меня. См. Прикрепленное изображение.enter image description here

Попробуйте очистить рабочее пространство. Если это не сработает, попробуйте создать новый проект Java и скопируйте тот же самый код, который вы найдете здесь, и попробуйте. Он должен работать.

+0

Это было именно со мной. но я думаю, из-за некоторой проблемы с промывкой его объекты не записываются. – ankurtr

+0

Я бы предложил попробовать очистку рабочего пространства или попробовать тот же код в новом проекте. –

0

Вы делаете глупость записи выходной строки через ObjectOutputStream, которая сериализует объекты String и Integer в вашем коде и сохраняет состояние объекта вместе со значением объекта. Вот почему вы видите кодированный текст при открытии файла. Ниже приводится выдержка суммирует значения, которые хранятся, когда объект сериализации:

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

Метод writeObject отвечает за запись состояния объекта для его определенного класса, так что соответствующий метод readObject может восстановить его.

Примитивные данные, исключая сериализуемые поля и внешние данные, записываются в ObjectOutputStream в записи блоков данных. Запись данных блока состоит из заголовка и данных. Заголовок блока данных состоит из маркера и количества байтов, следующих за заголовком.

Смежные вопросы