我写了一个程序,将一行写入文件。当我使用更通用的导入时,它不会编译,而使用这些导入它可以工作:
import java.nio.file.*;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.io.BufferedWriter;
public class IOtest {
public static void main(String[] args) throws IOException {
Charset charset = Charset.forName("US-ASCII");
Path path = Paths.get("C:\Users\ELiz\Desktop\Lcode\tests\filetest\Maryhad.txt");
String s = "Mary had a little lamb.";
try (BufferedWriter writer = Files.newBufferedWriter(path, charset)) {
writer.write(s, 0, s.length());
} catch (IOException x) {
System.err.format("IOException: %s%n", x);
}
}
}
在我的命令行中编译没有问题,我正在运行 windows 7 和 jdk 8。但是当我使用:
import java.nio.*;
import java.io.*;
public class IOtest {
public static void main(String[] args) throws IOException {
Charset charset = Charset.forName("US-ASCII");
Path path = Paths.get("C:\Users\ELiz\Desktop\Lcode\tests\filetest\Maryhad.txt");
String s = "Mary had a little lamb.";
try (BufferedWriter writer = Files.newBufferedWriter(path, charset)) {
writer.write(s, 0, s.length());
} catch (IOException x) {
System.err.format("IOException: %s%n", x);
}
}
}
我收到错误:
IOtest2.java:8: error: cannot find symbol
Charset charset = Charset.forName("US-ASCII");
^
symbol: class Charset
location: class IOtest2
IOtest2.java:8: error: cannot find symbol
Charset charset = Charset.forName("US-ASCII");
^
symbol: variable Charset
location: class IOtest2
IOtest2.java:10: error: cannot find symbol
Path path = Paths.get("C:\Users\ELiz\Desktop\Lcode\tests\filetes
t\Maryhad.txt");
^
symbol: class Path
location: class IOtest2
IOtest2.java:10: error: cannot find symbol
Path path = Paths.get("C:\Users\ELiz\Desktop\Lcode\tests\filetes
t\Maryhad.txt");
^
symbol: variable Paths
location: class IOtest2
IOtest2.java:14: error: cannot find symbol
try (BufferedWriter writer = Files.newBufferedWriter(path, charset)) {
^
symbol: variable Files
location: class IOtest2
5 errors
我试图理解为什么一组导入在编译时有效,而另一组则不工作。类文件、路径、路径和字符集都是 java.nio 包的一部分,为什么不导入?我可以使用较短的导入版本吗?
Java 包中没有层次结构。
java.nio.charset
不是 的"子包">
java.nio
所以导入java.nio.*
不会导入java.nio.charset.*
.
如果要导入java.nio.charset
包中的所有内容以及java.nio
包中的所有内容,则必须通配符导入两者:
import java.nio.*;
import java.nio.charset.*;
请注意,通配符导入(或语言规范中称为"按需导入"(并不是特别有用。它们模糊了源文件中特定名称的导入位置,因此难以理解代码。事实上,一些风格指南(例如谷歌的Java风格指南(完全禁止通配符导入。
任何有价值的IDE都可以自动插入(非通配符(导入;例如,Eclipse中的CtrlShiftO"组织导入"。如果你不使用IDE,你只会让你的生活变得不必要地困难。
要使其工作,您需要添加
import java.nio.file.*;
通配符"*"仅使此包中的类可见,而不使任何子包可见。
这也意味着要导入java.nio.charset.Charset;
您需要添加:
import java.nio.charset.*;
好吧,你的假设是不正确的。 子包不会作为通配符"*"导入的一部分导入,只有类会导入。
因此,在您的情况下,它将是:
import java.nio.file.*;
import java.io.*;
import java.nio.charset.*;
您不能导入 java.nio.*,因为 Charset (ex.( 不是它自己的类。对同一包级别中的类使用通配符,而不是对子包使用通配符。