2013-08-16 2 views
1

я тестируя записи файлов с этим кодом:Java: Проблемы с доступом и запись в файл

package files; 

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 

public class FileTest1 
{ 
public static void main(String[] args) 
{ 
    try 
    { 
     try 
     { 
      File f = new File("filetest1.txt"); 
      FileWriter fWrite = new FileWriter(f); 
      BufferedWriter fileWrite = new BufferedWriter(fWrite); 
      fileWrite.write("This is a test!"); 
     } 
     catch(FileNotFoundException e) 
     { 
      System.out.print("A FileNotFoundException occurred!"); 
      e.printStackTrace(); 
     } 
    } 
    catch(IOException e) 
    { 
     System.out.println("An IOException occurred!:"); 
     e.printStackTrace(); 
    } 
} 

}

Ничего не происходит, когда она выполняется. «Это тест!» не написано, не было StackTrace или «A/An [exception]!» ... Я не знаю, что вызывает проблему. У меня есть файлTest1.txt в пакете прямо под файлом ...

+0

Ваш код говорит 'filetest1.txt', и ваш комментарий говорит' fileTest1.txt'? Большинство файловых систем чувствительны к регистру. Возможно, вам также захочется очистить файл и закрыть его. – Hyperboreus

+0

Можете ли вы показать команду, которую вы используете для запуска вашей программы? Вы делаете это, бросаете некоторую среду IDE? На какой платформе вы работаете? Кроме того, вы говорите: «У меня есть файлTest1.txt в пакете прямо под файлом» - можете ли вы пояснить, что это значит? –

+0

Кроме того, вы уверены, что на самом деле вы управляете программой, которую, как вы думаете, работаете? Вы действительно используете 'FileTest1'? Добавьте 'System.println (« Hello »);' или что-то в качестве первой строки main. Отображается ли она? Является ли рабочий каталог отличным от ожидаемого? Создается ли 'filetest1.txt' где-то еще? –

ответ

4

A BufferedWriter делает именно это, он буферизует выход до его записи в пункт назначения. Это может привести к тому, что BufferedWriter будет использоваться быстрее, так как ему не нужно сразу записывать в медленный пункт назначения, например диск или сокет.

содержимое будет записано, когда внутренний буфер в полной мере, вы flush в Writer или close писатель

Помните, что если вы откроете его, вы должны закрыть его ...

Например. ..

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 

public class TestFileWriter { 

    public static void main(String[] args) { 
     try { 
      BufferedWriter fileWrite = null; 
      try { 
       File f = new File("filetest1.txt"); 
       System.out.println("Writing to " + f.getCanonicalPath()); 
       FileWriter fWrite = new FileWriter(f); 
       fileWrite = new BufferedWriter(fWrite); 
       fileWrite.write("This is a test!"); 
       fileWrite.flush(); 
      } catch (FileNotFoundException e) { 
       System.out.print("A FileNotFoundException occurred!"); 
       e.printStackTrace(); 
      } finally { 
       try { 
        // Note, BufferedWriter#close will also close 
        // the parent Writer... 
        fileWrite.close(); 
       } catch (Exception exp) { 
       } 
      } 
     } catch (IOException e) { 
      System.out.println("An IOException occurred!:"); 
      e.printStackTrace(); 
     } 
     try { 
      BufferedReader br = null; 
      try { 
       File f = new File("filetest1.txt"); 
       System.out.println("Reading from " + f.getCanonicalPath()); 
       FileReader fReader = new FileReader(f); 
       br = new BufferedReader(fReader); 
       String text = null; 
       while ((text = br.readLine()) != null) { 
        System.out.println(text); 
       } 
      } catch (FileNotFoundException e) { 
       System.out.print("A FileNotFoundException occurred!"); 
       e.printStackTrace(); 
      } finally { 
       try { 
        // Note, BufferedWriter#close will also close 
        // the parent Writer... 
        br.close(); 
       } catch (Exception exp) { 
       } 
      } 
     } catch (IOException e) { 
      System.out.println("An IOException occurred!:"); 
      e.printStackTrace(); 
     } 
    } 
} 

Если вы используете Java 7, вы можете, как смотреть на try-with-resources

+0

Хорошо ... Я исправил capitolization и добавил: fileWriter.flush() и fileWriter.close(), но все равно ничего не происходит. – user2604533

+0

Я написал это, но все же ничего не произошло. – user2604533

+0

Могу я попросить вас попробовать мой пример кода. Потому что это отлично работает для меня. Кроме того, убедитесь, что у вас есть доступ на запись к месту, которое вы пытаетесь написать, чтобы ... – MadProgrammer

1

После

fileWrite.write("This is a test!"); 

вы должны flush() писателя. Чтобы избежать утечки ресурсов, вы также должны написать close() писатель (который автоматически сбрасывает его).

Так что вам нужно добавить:

fileWrite.close(); 
0

Вы должны позвонить close() или не менее flush() на запись, чтобы буфер был действительно записан в файл.

+1

Вы должны ** всегда ** закрывать любой ресурс, который вы открываете, это может вызвать проблемы позже - IMHO – MadProgrammer

+0

Я согласен, и я бы даже сделал это в «наконец», чтобы быть действительно уверенным. Но вопрос в том, почему данные не видны, и это может быть достигнуто только с помощью 'flush()'. – FrankPl

+0

(nit pick). Вся проблема действительно может быть решена путем вызова 'close', что не только помогает решить проблему OP, но и демонстрирует хорошие практики. Если OP писал «Socket», он бы вызывающе соглашался с добавлением «flush» - IMHO – MadProgrammer