2〜3の整数を含む1つのテキストファイル( "1.txt")の内容(例:1 2 3)を別のテキストファイル( "2.txt")にコピーしようとしていますが、次のエラーが発生しますコンパイル時に
import Java.io.*;
class FileDemo {
public static void main(String args[]) {
try {
FileReader fr=new FileReader("1.txt");
FileWriter fw=new FileWriter("2.txt");
int c=fr.read();
while(c!=-1) {
fw.write(c);
}
} catch(IOException e) {
System.out.println(e);
} finally() {
fr.close();
fw.close();
}
}
}
コマンド・プロンプト:-
C:\Documents and Settings\Salman\Desktop>javac FileDemo.Java
FileDemo.Java:20: error: '{' expected
finally()
^
FileDemo.Java:20: error: illegal start of expression
finally()
^
FileDemo.Java:20: error: ';' expected
finally()
^
FileDemo.Java:27: error: reached end of file while parsing
}
^
4 errors
しかし、コードをチェックすると、finally()ブロックが適切に閉じられていることがわかりました。
finally()
ではなくfinally
です:
try {
//...
} catch(IOException e) {
//...
} finally {
//...
}
ところで、そこには無限ループがあります:
int c=fr.read();
while(c!=-1) {
fw.write(c);
}
ループを終了させるには、ループ内のデータを読み取る必要があります。
int c=fr.read();
while(c!=-1) {
fw.write(c);
c = fr.read();
}
finally
ブロックでは、fr
およびfw
変数はtry
ブロックのスコープ内で宣言されているため、見つかりません。外で宣言する:
FileReader fr = null;
FileWriter fw = null;
try {
//...
ここで、これらはnull
値で初期化されるため、閉じる前にnull
チェックも行う必要があります。
finally {
if (fr != null) {
fr.close();
}
if (fw != null) {
fw.close();
}
}
そして、両方のclose
メソッドはIOException
をスローする可能性があり、これも処理する必要があります。
finally {
if (fr != null) {
try {
fr.close();
} catch(IOException e) {
//...
}
}
if (fw != null) {
try {
fw.close();
} catch(IOException e) {
//...
}
}
}
最後に、基本的なストリームを閉じるために多くのコードを必要としないので、それを Closeable
を処理するメソッドに移動するだけです(両方のFileReader
とFileWriter
はこのインターフェースを実装しています):
public static void close(Closeable stream) {
try {
if (stream != null) {
stream.close();
}
} catch(IOException e) {
//...
}
}
最終的に、コードは次のようになります。
import Java.io.*;
class FileDemo {
public static void main(String args[]) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("1.txt");
fw = new FileWriter("2.txt");
int c = fr.read();
while(c!=-1) {
fw.write(c);
c = fr.read();
}
} catch(IOException e) {
e.printStackTrace();
} finally {
close(fr);
close(fw);
}
}
public static void close(Closeable stream) {
try {
if (stream != null) {
stream.close();
}
} catch(IOException e) {
//...
}
}
}
Java 7なので、try-with-resources
なので、上記のコードは次のように書き直すことができます。
import Java.io.*;
class FileDemo {
public static void main(String args[]) {
//this will close the resources automatically
//even if an exception rises
try (FileReader fr = new FileReader("1.txt");
FileWriter fw = new FileWriter("2.txt")) {
int c = fr.read();
while(c!=-1) {
fw.write(c);
c = fr.read();
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
より効率的な方法は...
public class Main {
public static void main(String[] args) throws IOException {
File dir = new File(".");
String source = dir.getCanonicalPath() + File.separator + "Code.txt";
String dest = dir.getCanonicalPath() + File.separator + "Dest.txt";
File fin = new File(source);
FileInputStream fis = new FileInputStream(fin);
BufferedReader in = new BufferedReader(new InputStreamReader(fis));
FileWriter fstream = new FileWriter(dest, true);
BufferedWriter out = new BufferedWriter(fstream);
String aLine = null;
while ((aLine = in.readLine()) != null) {
//Process each line and add output to Dest.txt file
out.write(aLine);
out.newLine();
}
// do not forget to close the buffer reader
in.close();
// close buffer writer
out.close();
}
}
Finally
ブロックには、丸括弧を使用しないでください。
試してください:
import Java.io.*;
class FileDemo
{
public static void main(String args[])
{
try
{
FileReader fr=new FileReader("1.txt");
FileWriter fw=new FileWriter("2.txt");
int c=fr.read();
while(c!=-1)
{
fw.write(c);
c = fr.read(); // Add this line
}
}
catch(IOException e)
{
System.out.println(e);
}
finally
{
fr.close();
fw.close();
}
}
}
これをチェックしてください javapractices より良いアイデアが得られます。それはあなたが最終的にトライキャッチについてもっと理解するのに役立ちます。
import Java.io.*;
class FileDemo
{
public static void main(String args[])throws IOException
{
FileReader fr=null;
FileWriter fw=null;
try
{
fr=new FileReader("1.txt");
fw=new FileWriter("2.txt");
int c=fr.read();
while(c!=-1)
{
fw.write(c);
}
}
catch(IOException e)
{
System.out.println(e);
}
finally
{
fr.close();
fw.close();
}
}
}
1.あなたのコードは正しくありません>最後のブロックは、もしそれが前に括弧をつけません。 2.括弧は常にメソッドの前にのみ来る。 3. FileReaderオブジェクトとFileWrierオブジェクトのスコープがtryブロックで終わっているので、findブロックでfw not foundおよびfr not foundというエラーがもう1つ表示されます。
そのコンパイルエラー
public static void main(String args[])
{
try
{
FileReader fr=new FileReader("1.txt");
FileWriter fw=new FileWriter("2.txt");
int c=fr.read();
while(c!=-1)
{
fw.write(c);
}
}
catch(IOException e)
{
System.out.println(e);
}
finally // finally doesn't accept any arguments like catch
{
fr.close();
fw.close();
}
}