Java怎样一行python 读入txt数据多个数据

java 如何从文件中读到一行数据并且修改其中的值?
例如张三86李四81我希望在不改变其他值的情况下 对第三行的86进行修改,修改成90,在文件中进行读写,该怎么解决?,希望大神回答下,给个代码。
浏览 801回答 2
import java.io.BufferedR
import java.io.BufferedW
import java.io.F
import java.io.FileOutputS
import java.io.InputS
import java.io.InputStreamR
import java.io.OutputStreamW
* @author {Mark Sir}
public class Test {
public static void main(String[] args) throws Exception {
InputStream input = Test.class.getResourceAsStream(&file.txt&);
BufferedReader br = new BufferedReader(new InputStreamReader(input,
File file = new File(&D://output.txt&);
if (file.exists()) {
file.delete();
BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file), &UTF-8&));
String tmp =
StringBuffer sb = new StringBuffer();
while ((tmp = br.readLine()) != null) {
if (tmp.contains(&86&)) {
sb.append(&96&);
sb.append(tmp);
sb.append(&,&);
System.out.println(sb.toString());
bos.write(sb.toString());
bos.close();
br.close();
input.close();
System.out.println(&over&);
你把每一行的数据分开放在容器中;通过判断目标内容在何方,更改对应的目标内容即可。
随时随地看视频博客分类:
java 利用poi 读execel文件的操作,读取总的数据行数一般是通过调用 sheet.getLastRowNum() ;可是这样有时候会出现一些问题,例如,当其中一行的数据的确都为空,可是其原本的格式还在,并没有连带删除,这样计算出来的行数就不真实(比真实的大),还有当出现空白行时(也即某一行没有任何数据,通过Row row = sheet.getRow(i) 返回的row值为null),计算出来的值也不正确。
&&&& 本人自己写了一个方法来对execel表进行过滤,将那些没有意义的行删掉,之后再调用sheet.getLastRowNum() 得到的值就是正确的了。
&&& 说明一下,本程序是结合自己项目的需求编写的,对于那些空白行有意义的execel文件来说,本文不存在参考价值。
import java.io.FileInputS&
import org.apache.poi.hssf.usermodel.HSSFW&
import org.apache.poi.hssf.util.CellR&
import org.apache.poi.ss.usermodel.C&
import org.apache.poi.ss.usermodel.R&
import org.apache.poi.ss.usermodel.S&
import org.apache.poi.ss.usermodel.W&
public class test2{&
&&& public static void main(String[] args) {&
&&&&&&& Workbook wb =&
&&&&&&& try {&
&&&&&&&&&&& wb = new HSSFWorkbook(new FileInputStream("E:\\Workspaces\\testdata\\仓库数据.xls"));&
&&&&&&& } catch (Exception e) {&
&&&&&&&&&&&&& //&
&&&&&&& }&
&&&&&&& Sheet sheet = wb.getSheetAt(0);&
&&&&&&& CellReference cellReference = new CellReference("A4");&
&&&&&&& boolean flag =&
&&&&&&& System.out.println("总行数:"+(sheet.getLastRowNum()+1));&
&&&&&&& for (int i = cellReference.getRow(); i &= sheet.getLastRowNum();) {&
&&&&&&&&&&& Row r = sheet.getRow(i);&
&&&&&&&&&&& if(r == null){&
&&&&&&&&&&&&&&& // 如果是空行(即没有任何数据、格式),直接把它以下的数据往上移动&
&&&&&&&&&&&&&&& sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);&
&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&
&&&&&&&&&&& flag =&
&&&&&&&&&&& for(Cell c:r){&
&&&&&&&&&&&&&&& if(c.getCellType() != Cell.CELL_TYPE_BLANK){&
&&&&&&&&&&&&&&&&&&& flag =&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&& }&
&&&&&&&&&&& if(flag){&
&&&&&&&&&&&&&&& i++;&
&&&&&&&&&&&&&&&&
&&&&&&&&&&& }&
&&&&&&&&&&& else{//如果是空白行(即可能没有数据,但是有一定格式)&
&&&&&&&&&&&&&&& if(i == sheet.getLastRowNum())//如果到了最后一行,直接将那一行remove掉&
&&&&&&&&&&&&&&&&&&& sheet.removeRow(r);&
&&&&&&&&&&&&&&& else//如果还没到最后一行,则数据往上移一行&
&&&&&&&&&&&&&&&&&&& sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);&
&&&&&&&&&&& }&
&&&&&&& }&
&&&&&&& System.out.println("总行数:"+(sheet.getLastRowNum()+1));&
浏览: 2354 次
来自: 成都
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'后使用快捷导航没有帐号?
查看: 4524|回复: 0
【转】详细整理Java 从命令控制台输入数据读取输入流System.in的几种常用方法
论坛徽章:62
本帖最后由 辰昊楠 于
01:47 编辑
一、System.in(最笨的方法)首先看jdk的API.System的静态方法in返回的是一个InputStream类型的对象,则我们可以用读取输入流的方式对其进行读取。按API的说法“此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。”键盘上按下的任何一个键都会被当做是输入值。如何回显输入值?我们就用读取输入流的方式进行读取,还是看APIInputStream包含方法read();read(byte[] b);read(byte[] b, int off, int len) ;
1、read();看API从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。返回一个整型字节数据,该数据表示的是字节因此是Unicode的第一个字节或是字符的ASCII码值。该方法是从一个流中一个一个的读取数据,因此是一个迭代的过程。如果到达流的末尾,则返回 -1重复调用System.in.read()实际上是在遍历该流中的每一个字节数据。最常见的流是键盘输入流。以下为例:
import java.io.IOE&&public class Test1 {&&& & public static void main(String[] args) throws IOException {&&& && &&&System.out.println(&请输入:&);&&& && &&&int i = 0;&&& && &&&while(i!=-1){//读取输入流中的字节直到流的末尾返回1&&& && && && &i = System.in.read();&&& && && && &System.out.println(i);&&& && &&&}&&& & }&&}&&
如图我们输入ABCD则返回了其ASCII值& && && && && && && && && && && && && && && && && && && && &&&如果System.out.println(i);改为System.out.println((char)i);强制转换为char字符,则输出ABCD& && && && && && && && && && && && && && && && && && && &&&这里的13和10是读取的键盘的回车,我们在键盘上按一下回车键,实际上读取到的是两个字符,即“\r”(13)和“\n”(10)。字符“\r”表示回车,即光标回到当前行的行首而不换行;字符“\n”表示换行,即光标移到当前行的下一行行首。(这里还要PS下回车的来历:
回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。/*======================================*/\n:&&UNIX 系统行末结束符\n\r: window 系统行末结束符\r:&&MAC OS 系统行末结束符/*======================================*/一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号有兴趣可以去查看相关资料)
这里还有一个小情况,看下面的小例子
import java.io.IOE&&public class Test2 {&&& & public static void main(String[] args) throws IOException {&&& && &&&System.out.println(&请输入:&);&&& && &&&char ch = (char)System.in.read();&&& && &&&System.out.println(&hello& + ch + &AB&);&&& && &&&}&&& & }&&
很明显这是只读取一个字符,然后插入到字符串“hello”和“AB”之间,我们无论输入1个字符还是多个字符都是只读取第一个字符,如输入“UFO”
打印出“helloUAB”但我们不输入任何值只按一个回车时,在cmd命令窗口与IDE工具(eclipse)输出就不一样了,如下图:
cmd命令行,编译运行结果& && && && && && && && && && && && &&&eclipse运行结果输入“UFO” 和只按回车两种情况
我们可以注意到输入其它字符的运行结果一样,直接按回车的话,cmd下打印出的是&ABllo&,也就是说cmd回车(获得两个字符“\r”和“\n”),只读取了第一个字符“\r”,即将光标放到行首不换行,所以导致了覆盖hello,那为什么在IDE工具(eclipse)下也是只读取了回车,却换行了呢,这应该是eclipse将回车与换行是连用的,无论是System.out.print(&a\rb&);System.out.print(&a\nb&);还是System.out.print(&a\r\nb&);输出都是a回车b.此句系本人杜撰,大家可以亲试核实。好了read()就说这些了2、read(byte[] b)API里InputStream的read(byte[] b)同样是返回一个int值,但此处的用法跟read()完全不一样。此处是从输入流中读取一定数量的字节,并将其存储在缓冲区数组b 中。以整数形式返回实际读取的字节数
如果 b 的长度为 0,则不读取任何字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有可用的字节,则返回值-1;否则,至少读取一个字节并将其存储在b 中。
将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。读取的字节数最多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在 b[0] 到 b[k-1] 的元素中,不影响b[k] 到b[b.length-1] 的元素。
此时我们有了byte数组,有了返回的字节数,就可以用String的构造方法String(byte[] bytes, int offset, int length) :& &&&通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的String。即可返回键盘的输入
public class TestInput1 {&&& && && && &public static void main(String[] args) {&&& && && && && && && & try{&&& && && && && && && && && && & //提示信息&&& && && && && && && && && && & System.out.println(&请输入:&);&&& && && && && && && && && && & //数组缓冲&&& && && && && && && && && && & byte[] b = new byte[1024];&&& && && && && && && && && && & //读取数据&&& && && && && && && && && && & int n = System.in.read(b);&&& && && && && && && && && && & //转换为字符串&&& && && && && && && && && && & String s = new String(b,0,n);&&& && && && && && && && && && & //回显内容&&& && && && && && && && && && & System.out.println(&输入内容为:& + s);&&& && && && && && && & }catch(Exception e){}&&& && && && &}&&& &}&&
这里斟酌通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。这句话,我亲自核实,此TestInput1.Java的编码格式为utf-8非本地默认编码格式时(我们国内的电脑默认编码GB2312),输出到控制台会是乱码,而改为GB2312时则正确输出,已证实。还有一句...不影响 b[k] 到 b[b.length-1] 的元素。我们也可以试试,将以上代码略作改动如下:
public class TestInput1 {&&& && && && &public static void main(String[] args) {&&& && && && && && & try{&&& && && && && && && && && & //提示信息&&& && && && && && && && && & System.out.println(&请输入:&);&&& && && && && && && && && && & //数组缓冲&&& && && && && && && && && & byte[] b = new byte[1024];&&& && && && && && && && && && && && && && && && && && && & //假设我们已知道键盘输入的是ABCD加回车是6个字符,我们将b[0]到b[9]分别提前赋值&&& && && && && && && && && & for (int i = 0; i & 10; i++) {//这里b[0]-b[9]分别赋值a-j&&& && && && && && && && && && &&&b = (byte)(97+i);//a的ascii值为97&&& && && && && && && && && & }&&& && && && && && && && && && & //读取数据&&& && && && && && && && && && & int n = System.in.read(b);&&& && && && && && && && && & //转换为字符串&&& && && && && && && && && & //这次我们构造String为了输出byte数组的所有值,所以不再用返回的值n而用我们预知的10个&&& && && && && && && && && & String s = new String(b,0,10);&&& && && && && && && && && & //回显内容&&& && && && && && && && && & System.out.println(&输入内容为:& + s);&&& && && && && && && & }catch(Exception e){}&&& && && &}&&}&&
这次我们打印到控制台的是:
很明显原本应该输出的是abcdefghij经过读取键盘输入后,影响了n=6个字节,4个字母加回车的“\r”“\n”此句也证实了回车确实是两个字符。
3、read(byte[] b, int off, int len)和上面类似但读取的长度,位置做了限定API如下:
将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数
将读取的第一个字节存储在元素 b[off] 中,下一个存储在 b[off+1] 中,依次类推。读取的字节数最多等于len。设k 为实际读取的字节数;这些字节将存储在 b[off] 到 b[off+k-1] 的元素中,不影响b[off+k] 到b[off+len-1] 的元素。
同样拿上面的abcdefghij做个例子仅仅将上一个例子的int n = System.in.read(b);改为int n = System.in.read(b,3,4);则意思的,将读取的第一个字节存储在b[3]依次最多存储4个,这时我们再次运行,还是输入ABCD,刚好4个,错还有回车两个,输出的控制台是:
很明显b[3],b[4],b[5],b[6]处的字符defg被读入的4个字符覆盖,而且是只读取了4个,没有回车。
本来是要说JAVA从控制台输入数据的方法,结果扯了这么多,现在说说第二个方法:
二、java.util.Scanner从 JDK 5.0 开始,基本类库中增加了java.util.Scanner类,使用它的Scanner(InputStream source)构造方法,可以传入系统的输入流System.in而从控制台中读取数据。当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。
import java.util.S&&public class TestSc {&&& & public static void main(String[] args) {&&& && &&&System.out.println(&请输入:&);&&& && &&&Scanner sc = new Scanner(System.in);& && && &&&System.out.println(sc.nextLine());&&& & }&&}&&
输出到控制台即是你键入的字符串,这里不做演示,关键说下Scanner的next(),nextLine();
1、nextLine();API此扫描器执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。意思就是读出当前下标的一行,对它来讲每行就是他的分隔符。如上例子中的末尾[java]
System.out.println(sc.nextLine());改为&pre class=&java& name=&code&&System.out.println(&hello&+sc.nextLine()+&ufo&);&&&/pre&&&&pre&&/pre&&&&span style=&font-family:monospace&&输入“ABCD”打印到控制台为“helloABCDufo”回车并没有被输出。比较来说此方法更简洁实用,其实是Scanner对System.in做了封装处理。&/span&&&&pre&&/pre&&&&pre&&/pre&&&
2、next();查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,Scanner默认使用空格作为分割符来分隔文本,但允许你指定新的分隔符如下例:
import java.util.S&&public class TestSc {&&& & public static void main(String[] args) {&&& && &&&Scanner sc = new Scanner(&aa bb cc,dd,ee&);&&& && &&&//sc.useDelimiter(&,&);&&& && && &while (sc.hasNext()) {& && && && && & System.out.println(sc.next());& && && && &}&&& & }&&}&&
将空格做分隔符输出结果为:& && && && &&&将注释去掉,试用逗号做分隔符输出为:
&&Scanner的更多方法资料可以自己去查阅学习。
继续JAVA从控制台输入数据的方法
三、java.io.Console
从 JDK 6.0 开始,基本类库中增加了java.io.Console类,用于获得与当前 Java 虚拟机关联的基于字符的控制台设备。在纯字符的控制台界面下,可以更加方便地读取数据
import java.io.C&&public class TestSc {&&& & public static void main(String[] args) {&&& && &&&System.out.println(&请输入&);&&& && &&&Console cs = System.console();&&& && &&&if (cs == null) {& && && && && &throw new IllegalStateException(&不能使用控制台&);& && && &&&}& && && &&&System.out.println(cs.readLine());& && & }&&}&&
值得一提的是此方法只是在cmd命令窗口可以得到Console实例顺利运行,在IDE工具下如eclipse下得不到Console实例的,cs==null无法实现输入。
API中解释:虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。
如果此虚拟机具有控制台,那么它将由此类的实例(可通过调用
方法获得)表示。如果没有可用的控制台设备,那么对该方法的调用将返回null。
所以在 IDE 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中。因此,在 IDE 中不能使用这个程序。
继续正题,JAVA从控制台输入数据的方法
四、BufferedReader其实也是用的IO流这个就不多解释了,就这样吧。
try {&&& & BufferedReader br = new BufferedReader(new InputStreamReader(System.in));&&& & String s = br.readLine();& && && &} catch (IOException e) {&&& & e.printStackTrace();&&}&&
readLine():读取一个文本行。
dataguru.cn All Right Reserved.
扫一扫加入本版微信群01:07 提问
Java中如何把数据库中查询到的多条数据读出来
急求帮助!在Java语言中,如何把数据库中查询到的多条数据读出来。。。。。。。。。。。。
按赞数排序
while (rs.next()) {
//rs就是一行
rs.getXXX 获取这一行的某个字段
使用jdbc连接mysql数据库,然后循环去读取,这是比较原始的做法,现在很多都使用持久化工具,如mybatis,jpa等。
用循环语句啊。
while (rs.next()) {
rs.getname(1);
可参考代码:
List list = new ArrayList();
//解析结果集
while (rs.next()) {
//此处可能会用到回调,需调用方映射对象map,该对象中定义一个方法将结果集的一行记录映射为一个object(即你想要得到的对象类型)
Object object
= map.resultMpp(ResultSet rs );
list.add(object);
List&User& list = new ArrayList&User&();
DataBaseConnection conn =new
DataBaseConnection();
String sql = "select * from user order by userid desc limit ?,?";
PreparedStatement ps = conn.getConnection().prepareStatement(sql);
ps.setInt(1, (page-1) * User.PAGE_SIZE);
ps.setInt(2, User.PAGE_SIZE);
ResultSet rs = ps.executeQuery();
while(rs.next()){
User user = new User();
user.setUserid(rs.getInt("userid"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
list.add(user);
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐博客分类:
java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象。常用的类有BufferedReader,Scanner。实例程序:一,利用 Scanner 实现从键盘读入integer或float 型数据
import java.util.*;
public class test {
public static void main(String args[])
Scanner in=new Scanner(System.in); //使用Scanner类定义对象
System.out.println("please input a float number");
float a=in.nextFloat(); //接收float型数据
System.out.println(a);
System.out.println("please input a integer number");
int b=in.nextInt(); //接收整形数据
System.out.println(b);
二,利用 BufferedReader实现从键盘读入字符串并写进文件abc.txt中
import java.io.*;
public class Test
public static void main(String[] args) throws IOException
BufferedReader buf = new BufferedReader (new InputStreamReader(System.in));
BufferedWriter buff = new BufferedWriter(new FileWriter("abc.txt"));
String str = buf.readLine();
while(!str.equals("exit"))
buff.write(str);
buff.newLine();
str = buf.readLine();
buf.close();
buff.close();
关于JDK1.5 Scanner类的说明
Scanner是SDK1.5新增的一个类,可是使用该类创建一个对象.Scanner reader=new Scanner(System.in);
然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型:next.Byte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShot()
使用nextLine()方法输入行中可能包含空格.如果读取的是一个单词,则可调用.next()方法
三、Scanner和BufferedReader的区别
在命令行模式下要输入数据至程序中时,我们可以使用标准输入串对象System.in.但是,我们并不经常直接使用它,因为System.in提供的 read方法每次只能读取一个字节的数据,而我们平时所应用的通常是读取一个字符串或者是一个数字,所以read方法所以提供的功能,对我们来说并没有太大的用处.在Java SE 6中,可以使用Scanner类取得用户的输入,Scanner类位于java.util包中,如果你要使用Scanner取得用户输入的话,要加上 import java.util.S这条语句.import的功能是告诉编译器,你将使用java.util包中的Scanner类.我们来看一个例子:
import java.util.S
public class Test
public static void main(String[] args)
Scanner scan = new Scanner(System.in);
System.out.println("请输入一个字符串:");
System.out.println("您输入的字符串是:" + scan.next());
运行上面的程序,你将会看到你输入的字符串将在下面原样显示出来.我们来看看这个程序中每条语句的意思:new是创建一个对象,程序中new的意思是创建了一个Scanner类的对象scan.但是在创建Scanner类的对象时,需要用System.in 作为它的参数,也可以将Scanner看作是System.in对象的支持者,System.in取得用户输入的内容后,交给Scanner来作一些处理.Scanner类中提供了多个方法:next():取得一个字符串;nextInt():将取得的字符串转换成int类型的整数;nextFloat():将取得的字符串转换成float型;nextBoolean():将取得的字符串转换成boolean型;
用Scanner获得用户的输入非常的方便,但是Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键.当按下这其中的任一键时,Scanner就会返回下一个输入. 当你输入的内容中间包括空格时,显然,使用Scanner就不能完整的获得你输入的字符串.这时候我们可以考虑使用BufferedReader类取得输入.其实在Java SE 1.4及以前的版本中,尚没有提供Scanner方法,我们获得输入时也是使用BufferReader的.BufferedReader类位于java.io包中,所以要使用这个类,就要引入java.io这个包:import java.io.BufferedReader.使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception).使用BufferedReader来取得输入,理解起来要复杂得多.但是使用这个方法是固定的,每次使用前先如法炮制就可以了.
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));String text = buffer.readLine();readLine()方法会返回用户在按下Enter键之前的所有字符输入,不包括最后按下的Enter返回字符.完整的示例程序如下:
import java.io.BufferedR
import java.io.IOE
import java.io.InputStreamR
public class TestBufferedReader
public static void main(String[] args) throws IOException
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入一串字符串");
String text = buffer.readLine();
System.out.println("您输入的字符串是:" + text);
四,利用 System.in.read 实现从键盘读入char 型数据
System.out.println("please input a char");
char c=(char)System.in.read();
System.out.println(c);
浏览 49377
浏览: 170903 次
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 python 读入数据 的文章

 

随机推荐