Java为什么用一般导入不编译



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

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.( 不是它自己的类。对同一包级别中的类使用通配符,而不是对子包使用通配符。

相关内容

  • 没有找到相关文章

最新更新