java为什么一般导入不编译

时间:2017-04-13 19:18:32

标签: java path writer

我写了一个程序,它将一行写入文件。当我使用更多的常规导入时,它不会编译,而使用这些导入它可以工作:

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包的一部分,为什么它们不导入?我可以使用更短的导入版本吗?

4 个答案:

答案 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(例如)不是它自己的类。对于相同级别的包而不是子包使用通配符。