我只是想知道为什么java.util.Scanner实现了java.util.Iterator?
Scanner实现remove方法并抛出UnsupportedOperationException.
但是,在实现接口时,不应该是一个类,履行接口的契约?
实现iterator和添加抛出异常的方法有什么用?
为什么不避免接口的实现并保持简单?
有人可以争辩说,它被定义为可以扩展的类Scanner可以实现该方法,就像AbstractList有一个抛出一个的add方法UnsupportedOperationException.但是AbstractList是一个abstract班级,而是Scanner一个final班级.
这不是一个糟糕的设计实践吗?
我目前正在使用split()扫描文件,其中每行包含多个字符串'~'.我读到某个地方Scanner可以用一个长文件做得更好,性能方面,所以我考虑检查出来.
我的问题是:我是否必须创建两个实例Scanner?也就是说,一个读取一行而另一个基于该行来获取分隔符的标记?如果我必须这样做,我怀疑我是否会从使用它中获得任何好处.也许我在这里错过了一些东西?
如何将扫描仪的分隔符设置为; 还是新线?
我试过了:
Scanner.useDelimiter(Pattern.compile("(\n)|;"));
但它不起作用.
这可能很快.为什么这段代码没有返回任何内容?
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
try {
Scanner sc = new Scanner("asda ASA adad");
String pattern = "[A-Z]+";
while ((sc.hasNext(pattern))) {
System.out.println(sc.next(pattern));
}
sc.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在读关于Console课程,在第一行,它是写的
Java 6的新手,当我们
Java SE 6从命令行运行时,我们通常使用控制台类对象
那么,这意味着我们通过命令行隐式使用控制台类?
然后,我开始寻找有关Console类的更多细节,我在java和Console链接中找到了来自控制台类的Input.所以,总结了一些观点
- 控制台类只能在IDE之外使用
System.console().readLine();Consoleclass 从控制台读取密码或密码,并使用回显禁用readPassword()
虽然,我们有Scanner类和BufferedReader类来从控制台读取输入,并且是在早期添加的Java 5.那么,仅仅因为安全原因Console类被添加了Java 6?或者是否有其他优势可以使用本课程.
有人可以分享更多关于Console课程的细节吗
我搜索过类似的问题,但没有人帮忙.
考虑一个文件:
你好你好吗?
当时你在哪里?
我希望在每一行结束后进行一些操作.如果我使用next()它,当我到达第一行的末尾时不会告诉我.
我也见过,hasNextLine()但它只告诉我是否存在另一条线.
根据Java API Scanner使用分隔符将整个输入分解为令牌.我试图理解令牌和分隔符.我正在做这个程序并且遇到了困惑
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner s = null;
try {
s = new Scanner(System.in);
s.useDelimiter("A");
System.out.println("1 " + s.next().length());
System.out.println("2 " + s.next().length());
System.out.println("3 " + s.next().length());
System.out.println("4 " + s.next().length());
} finally {
if (s != null) {
s.close();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用输入时,AAAAAasdf我得到以下输出.
1 0
2 0
3 0
4 0
Run Code Online (Sandbox Code Playgroud)
我可以理解这个输出,因为在分隔符之间令牌的长度为零,因此所有都是零但是当我使用默认分隔符并将输入作为
_____aaa\n- >用空格替换下划线,然后\n按下进入eclipse控制台.
为此,我得到输出为
1 3
Run Code Online (Sandbox Code Playgroud)
我无法理解.我给了5个空格,所以它们之间应该有4个长度为0的标记.为什么不?我在这里错过了什么?
我正在学习Java并且正在开展一些有趣的项目.我遇到的一个问题是,当我使用一个Scanner对象时,Eclipse警告我:
资源泄漏:'扫描'永远不会关闭.
所以,我scan.close();在代码的末尾添加了一个并处理警告.
问题来自因为我在同一个包中也有其他类也使用了扫描程序对象,并且Eclipse告诉我分别关闭这些类中的扫描程序.但是,当我这样做时,它似乎关闭所有扫描仪对象,并在运行时出现错误.
以下是导致错误的原因示例:
import java.util.Scanner;
public class test2 {
public static void main(String [] args) {
Scanner scan = new Scanner(System.in);
int test = 0;
do {
//Do stuff
test = scan.nextInt();
System.out.println(test);
scanTest scanTest = new scanTest();
scanTest.test();
} while (test != 0);
scan.close();
}
}
import java.util.Scanner;
public class scanTest {
public void test() {
Scanner scanner = new Scanner(System.in);
int blah = scanner.nextInt();
System.out.println(blah);
scanner.close();
}
}
Run Code Online (Sandbox Code Playgroud)
在scanTest类中关闭扫描仪并test2 …
我创建了一个简单的java"echo"应用程序,它接受用户的输入并将其显示给他们以演示该问题.我可以使用IntelliJ的内部"运行"命令,以及执行由...生成的编译的java文件时运行此应用程序gradle build.但是,如果我尝试使用执行应用程序gradle run,我会从扫描程序中抛出NoSuchElementException.
我认为gradle或应用程序插件特别对系统IO做了一些奇怪的事情.
应用
package org.gradle.example.simple;
import java.util.Scanner;
public class HelloWorld {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
String response = input.nextLine();
System.out.println(response);
}
}
Run Code Online (Sandbox Code Playgroud)
的build.gradle
apply plugin: 'java'
version '1.0-SNAPSHOT'
apply plugin: 'java'
jar {
manifest {
attributes 'Main-Class': 'org.gradle.example.simple.HelloWorld'
}
}
apply plugin: 'application'
mainClassName = "org.gradle.example.simple.HelloWorld"
sourceCompatibility = 1.5
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
Run Code Online (Sandbox Code Playgroud)
有关如何使用此应用程序的任何想法gradle run?
我正在尝试使用以下内容搜索特定字符串的大文本文件(400MB):
File file = new File("fileName.txt");
try {
int count = 0;
Scanner scanner = new Scanner(file);
while(scanner.hasNextLine()) {
if(scanner.nextLine().contains("particularString")) {
count++;
System.out.println("Number of instances of String: " + count);
}
}
} catch (FileNotFoundException e){
System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)
这适用于小文件,但对于此特定文件和其他大文件,它需要太长时间(> 10分钟).
这样做最快,最有效的方法是什么?
我现在改为以下内容,并在几秒钟内完成 -
try {
int count = 0;
FileReader fileIn = new FileReader(file);
BufferedReader reader = new BufferedReader(fileIn);
String line;
while((line = reader.readLine()) != null) {
if((line.contains("particularString"))) {
count++;
System.out.println("Number of instances of String " + count);
}
} …Run Code Online (Sandbox Code Playgroud)