JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 讀取文字檔該如何從某行開始讀!?
jog

Solaris 才是王道阿!!



發文: 76
積分: 3
於 2005-08-01 23:51 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
檔案小的話可以用 RandomAccessFile
readLine() 先移到自己要的行數在開始動作

不過這次不行了...檔案有 5 ~ 6 M
行數隨便就 2~30 萬行

在使用上面那個方法就很笨也超慢....

所以有沒有辦法讓我直接從檔案的某行開始讀!?
EX: 我要從第 164500 行開始讀

Thanks


reply to postreply to post
作者 Re:讀取文字檔該如何從某行開始讀!? [Re:jog]
阿刃

生活就像 RPG



發文: 121
積分: 3
於 2005-08-02 13:29 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
要不要改用NIO的FileChannel看看?
如果你用的是IO不就一定是以串流的方式進行存取...

如果改用NIO的FileChannel的話有
FileChannel position(long newPosition)
這個method可以跳到你所指定的block..

至於能不能達到指定行數的功能~"~小弟也不熟~


reply to postreply to post
A never ending story with Java...

My blog => 【刃™】ThiS WORLD, MY WORLD
作者 Re:讀取文字檔該如何從某行開始讀!? [Re:jog]
jog

Solaris 才是王道阿!!



發文: 76
積分: 3
於 2005-08-08 19:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
經過一週的掙扎.....終於找到超快的 solution
就是....使用 ByteBuffer
這樣即使用 readLine 一行一行的跳
仍然很快, 因為他不使用 io

大家可以參考一下, 在處理檔案的時候相當好用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  public QuickFind() {
  .....
  .....
      FileChannel fch = new RandomAccessFile(path, "r").getChannel();
      ByteBuffer roBuf = fch.map(FileChannel.MapMode.READ_ONLY, 0, (int)fch.size());
      DataInputStream is = new DataInputStream(newInputStream(roBuf));
      String aa = "";
      while(true){
        aa = is.readLine();
     .....
      .....
  }
 
  public static InputStream newInputStream(final ByteBuffer buf) {
      return new InputStream() {
          public synchronized int read() throws IOException {
              if (!buf.hasRemaining()) {
                  return -1;
              }
              return buf.get();
          }
 
          public synchronized int read(byte[] bytes, int off, int len) throws IOException {
              // Read only what's left
              len = Math.min(len, buf.remaining());
              buf.get(bytes, off, len);
              return len;
          }
      };
  }
 


reply to postreply to post
作者 Re:讀取文字檔該如何從某行開始讀!? [Re:jog]
mg622000

JAVA初心者



發文: 148
積分: 0
於 2005-08-09 10:28 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
小弟試了一下
速度果然快好多
可是中文多變亂碼了,請問可以把他轉回中文嗎?


reply to postreply to post
作者 Re:讀取文字檔該如何從某行開始讀!? [Re:mg622000]
jog

Solaris 才是王道阿!!



發文: 76
積分: 3
於 2005-08-09 15:56 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
mg622000 wrote:
小弟試了一下
速度果然快好多
可是中文多變亂碼了,請問可以把他轉回中文嗎?


因為我那邊都是 ascii 的資料所以沒有注意到
中文的問題.

但是我剛剛也順便解決了這個問題
剛剛我才發現 DataInputStream 已經不再支援 readLine()
所以我不用 DataInputStream 而改用 BufferedReader

修該方式如下 , 註記的地方是以前的 code

1
2
3
4
5
6
7
8
9
10
11
12
13
      FileChannel fch = new RandomAccessFile(path, "r").getChannel();
      ByteBuffer roBuf = fch.map(FileChannel.MapMode.READ_ONLY, 0, (int)fch.size());
      BufferedReader br = new BufferedReader(new InputStreamReader(newInputStream(roBuf)));
      
      //DataInputStream is = new DataInputStream(newInputStream(roBuf));
      String aa = "";
 
      while(true){
      ....
        aa = br.readLine();
      ....
 


reply to postreply to post
作者 Re:讀取文字檔該如何從某行開始讀!? [Re:jog]
JiaYun



版主

發文: 761
積分: 9
於 2010-12-08 12:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jog wrote:
經過一週的掙扎.....終於找到超快的 solution
就是....使用 ByteBuffer
這樣即使用 readLine 一行一行的跳
仍然很快, 因為他不使用 io

大家可以參考一下, 在處理檔案的時候相當好用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  public QuickFind() {
  .....
  .....
      FileChannel fch = new RandomAccessFile(path, "r").getChannel();
      ByteBuffer roBuf = fch.map(FileChannel.MapMode.READ_ONLY, 0, (int)fch.size());
      DataInputStream is = new DataInputStream(newInputStream(roBuf));
      String aa = "";
      while(true){
        aa = is.readLine();
     .....
      .....
  }
 
  public static InputStream newInputStream(final ByteBuffer buf) {
      return new InputStream() {
          public synchronized int read() throws IOException {
              if (!buf.hasRemaining()) {
                  return -1;
              }
              return buf.get();
          }
 
          public synchronized int read(byte[] bytes, int off, int len) throws IOException {
              // Read only what's left
              len = Math.min(len, buf.remaining());
              buf.get(bytes, off, len);
              return len;
          }
      };
  }
 



你這程式有 bug 哦

read(byte[] bytes, int off, int len) 裡面

如果 buf.remaining() 是 0 應該也要回 -1


reply to postreply to post
作者 Re:讀取文字檔該如何從某行開始讀!? [Re:jog]
mylee





發文: 764
積分: 1
於 2010-12-08 17:50 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jog wrote:
經過一週的掙扎.....終於找到超快的 solution
就是....使用 ByteBuffer
這樣即使用 readLine 一行一行的跳
仍然很快, 因為他不使用 io

大家可以參考一下, 在處理檔案的時候相當好用


沒事不要用 file mapping。它本質是 shared memory,如果你的檔案小,map 不 map 無差,
若檔案大,一 map 下去,乖乖不得了。


reply to postreply to post
作者 Re:讀取文字檔該如何從某行開始讀!? [Re:mylee]
JiaYun



版主

發文: 761
積分: 9
於 2010-12-08 18:57 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
mylee wrote:
沒事不要用 file mapping。它本質是 shared memory,如果你的檔案小,map 不 map 無差,
若檔案大,一 map 下去,乖乖不得了。


檔案大可能就要指定位置,分段做了


reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8