我写了一个程序,它将一行写入文件。当我使用更多的常规导入时,它不会编译,而使用这些导入它可以工作:
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包的一部分,为什么它们不导入?我可以使用更短的导入版本吗?
答案 0 :(得分:2)
Java包中没有层次结构。
java.nio.charset
不是
的“子包”java.nio
因此导入java.nio.*
不会导入java.nio.charset.*
。
如果要导入java.nio.charset
包中的所有内容以及java.nio
包中的所有内容,则必须使用通配符导入:
import java.nio.*;
import java.nio.charset.*;
请注意,通配符导入(或“按需导入”,因为它们在语言规范中调用)并不是特别有用。它们模糊了导入源文件中特定名称的位置,使得难以理解代码。实际上,一些样式指南(例如Google's Java style guide)完全禁止通配符导入。
任何值得盐的IDE都可以自动插入(非通配符)导入;例如,Eclipse中的 Ctrl Shift O “组织导入”。如果您没有使用IDE,那么您的生活就会变得非常困难。
答案 1 :(得分:0)
要使其正常工作,您需要添加
import java.nio.file.*;
通配符“*”仅使此包中的类可见,而不是任何子包。
这也意味着要导入java.nio.charset.Charset;
,您需要添加:
import java.nio.charset.*;
答案 2 :(得分:0)
嗯,你的假设是不正确的。子包将不会作为外卡的一部分导入' *'导入,只有类。
因此,在您的情况下,它将是:
import java.nio.file.*;
import java.io.*;
import java.nio.charset.*;
答案 3 :(得分:0)
您无法导入java.nio。*因为Charset(例如)不是它自己的类。对于相同级别的包而不是子包使用通配符。