在java中怎么入栈,如何在Java中按字符读取输入?

如何在Java中按字符读取输入?

我习惯了c样式getchar(),但似乎没有可比的Java。 我正在构建一个词法分析器,我需要逐个字符读取输入内容。

我知道我可以使用扫描仪扫描令牌或行并逐个字符地解析令牌,但是对于跨越多行的字符串来说似乎很难。 有没有一种方法可以从Java中的输入缓冲区中获取下一个字符,还是应该随身携带Scanner类?

输入是文件,而不是键盘。

9个解决方案

58 votes

使用Reader.read()。 返回值-1表示流的结尾; 否则,强制转换为char。

此代码从文件参数列表中读取字符数据:

public class CharacterHandler {

//Java 7 source level

public static void main(String[] args) throws IOException {

// replace this with a known encoding if possible

Charset encoding = Charset.defaultCharset();

for (String filename : args) {

File file = new File(filename);

handleFile(file, encoding);

}

}

private static void handleFile(File file, Charset encoding)

throws IOException {

try (InputStream in = new FileInputStream(file);

Reader reader = new InputStreamReader(in, encoding);

// buffer for efficiency

Reader buffer = new BufferedReader(reader)) {

handleCharacters(buffer);

}

}

private static void handleCharacters(Reader reader)

throws IOException {

int r;

while ((r = reader.read()) != -1) {

char ch = (char) r;

System.out.println("Do something with " + ch);

}

}

}

上面代码的坏处是它使用系统的默认字符集。 尽可能使用已知的编码(如果可以选择,最好使用Unicode编码)。 有关更多信息,请参见Charset类。 (如果您感到受虐狂,则可以阅读此字符编码指南。)

(您可能要注意的一件事是补充Unicode字符-需要存储两个char值的Unicode字符。有关更多详细信息,请参见Character类;这是一种边缘情况,可能不适用于家庭作业。)

McDowell answered 2020-07-02T01:22:42Z

15 votes

结合其他人的建议来指定字符编码和缓冲输入,这是我认为的很完整的答案。

假设您有一个File对象代表您想要读取的文件:

BufferedReader reader = new BufferedReader(

new InputStreamReader(

new FileInputStream(file),

Charset.forName("UTF-8")));

int c;

while((c = reader.read()) != -1) {

char character = (char) c;

// Do something with your character

}

roryparle answered 2020-07-02T01:23:07Z

6 votes

另一个选择是不逐字符读取内容-将整个文件读取到内存中。 如果您需要多次查看字符,这将很有用。 一种简单的方法是:

/** Read the contents of a file into a string buffer */

public static void readFile(File file, StringBuffer buf)

throws IOException

{

FileReader fr = null;

try {

fr = new FileReader(file);

BufferedReader br = new BufferedReader(fr);

char[] cbuf = new char[(int) file.length()];

br.read(cbuf);

buf.append(cbuf);

br.close();

}

finally {

if (fr != null) {

fr.close();

}

}

}

David answered 2020-07-02T01:23:27Z

6 votes

将输入流包装在缓冲的读取器中,然后使用read方法一次读取一个字节,直到流结束。

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class Reader {

public static void main(String[] args) throws IOException {

BufferedReader buffer = new BufferedReader(

new InputStreamReader(System.in));

int c = 0;

while((c = buffer.read()) != -1) {

char character = (char) c;

System.out.println(character);

}

}

}

pfranza answered 2020-07-02T01:23:47Z

2 votes

如果我是你,我只会使用扫描仪并使用“ .nextByte()”。 您可以将其转换为字符,这很好。

W. B. Reed answered 2020-07-02T01:24:07Z

1 votes

如果使用BufferedReader,则有几种选择。此缓冲的读取器比Reader快,因此可以包装它。

BufferedReader reader = new BufferedReader(new FileReader(path));

reader.read(char[] buffer);

这会将行读入char数组。 您有类似的选择。 查看文档。

shake answered 2020-07-02T01:24:31Z

1 votes

将您的阅读器包装在BufferedReader中,该BufferedReader维护一个缓冲区,以允许整体上更快地读取。 然后,您可以使用read()来读取单个字符(需要强制转换)。 您还可以使用readLine()提取整行,然后将其分成单个字符。 BufferedReader还支持标记和返回,因此,如果需要,您可以读取一行。

一般来说,您要使用BufferedReader或BufferedInputStream 在您实际使用的任何流之上,因为它们维护的缓冲区将使多次读取快得多。

James answered 2020-07-02T01:24:56Z

0 votes

在Java 5中增加了一个新功能,即Scanner方法,该功能使您有机会逐个读取Java中的字符。

例如;使用Scanner方法import java.util.Scanner;在主要方法之后:定义

扫描仪myScanner = new Scanner(System.in);//用于读取字符

char something = myScanner.findInLine(“。”)。charAt(0);

您可以存储单个字符,如果您想更多地阅读更多字符,可以声明更多对象,如anything1,anything2 ...请提供您的答案的更多示例(签入/粘贴)

import java.util.Scanner;

class ReverseWord {

public static void main(String args[]){

Scanner myScanner=new Scanner(System.in);

char c1,c2,c3,c4;

c1 = myScanner.findInLine(".").charAt(0);

c2 = myScanner.findInLine(".").charAt(0);

c3 = myScanner.findInLine(".").charAt(0);

c4 = myScanner.findInLine(".").charAt(0);

System.out.print(c4);

System.out.print(c3);

System.out.print(c2);

System.out.print(c1);

System.out.println();

}

}

samir vora answered 2020-07-02T01:25:34Z

-1 votes

这将从文件中每行打印1个字符。

try {

FileInputStream inputStream = new FileInputStream(theFile);

while (inputStream.available() > 0) {

inputData = inputStream.read();

System.out.println((char) inputData);

}

inputStream.close();

} catch (IOException ioe) {

System.out.println("Trouble reading from the file: " + ioe.getMessage());

}

grant zukowski answered 2020-07-02T01:25:54Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值