我有一个大文件(对于内存来说太大了),我需要用分隔符 \'|\' 解析每个记录。问题是,每个记录的大小都不同,这就是为什么我总是收到错误 \'但是...
我有一个大文件(对于内存来说太大了),我需要用分隔符“|”解析每个记录。问题是,每个记录的大小都不同,这就是为什么我总是收到错误“bufio.Scanner:token 太长”。
如果我遇到 bufio.Scanner:token too long 错误,是否有任何方法可以用更大的缓冲区大小重试扫描?或者 bufio.Scanner 对我来说不是正确的选择,因为我不知道每个记录的确切大小?
谢谢
https://go.dev/play/p/Erx15nXXCGk
package main
import (
"bufio"
"bytes"
"fmt"
"strings"
)
func main() {
// Example byte array
byteArray := []byte("data1|data2|data3|data4|data5|data6|data7|data8|data9|data10")
// Buffer size for reading chunks
bufferSize := 6
buf := make([]byte, bufferSize)
// Create a bufio.Scanner with a custom split function
scanner := bufio.NewScanner(bytes.NewReader(byteArray))
scanner.Buffer(buf, bufferSize)
scanner.Split(splitFunc)
// Read the byte array in chunks
for scanner.Scan() {
// Process each token (chunk)
chunk := scanner.Text()
fmt.Println("Chunk:", chunk, "Chunk Length:", len(chunk))
}
if err := scanner.Err(); err != nil {
if err == bufio.ErrTooLong {
fmt.Println("Error:", err)
fmt.Printf("Buffer size %d is too small...\n", bufferSize)
} else {
fmt.Println("Error:", err)
}
}
}
func splitFunc(data []byte, atEOF bool) (advance int, token []byte, err error) {
// Return nothing if at end of file and no data passed
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if i := strings.Index(string(data), "|"); i >= 0 {
return i + 1, data[0:i], nil
}
// If at end of file with data return the data
if atEOF {
return len(data), data, nil
}
return
}
我有一个应用程序,允许将字符串拖放到其中一个组件上。这很好用。现在我希望能够为该操作添加自定义选项。我的第一个
我有一个应用程序,允许将字符串拖放到其中一个组件上。这工作正常。
现在我希望能够为该操作添加自定义选项。我的第一个尝试是在接受放置操作后构造并显示 JPopupMenu。这似乎不起作用,因为弹出菜单没有显示,就像 show 方法被忽略了一样。
有没有什么办法可以解决此问题,或者我必须使用更重的东西,例如 JOptionPane?
这是我的示例代码:
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetAdapter;
import java.awt.dnd.DropTargetDropEvent;
import static java.awt.dnd.DnDConstants.ACTION_COPY;
public class DNDTest {
DNDTest() {
JFrame f = new JFrame("Test dnd");
Container c = f.getContentPane();
final JPanel jp = new JPanel(new BorderLayout());
jp.setBackground(Color.RED);
jp.setToolTipText("Drop a string here");
jp.setPreferredSize(new Dimension(200,200));
c.add(jp);
DropTarget dt = new DropTarget(jp, ACTION_COPY, new DropTargetAdapter() {
@Override
public void drop(DropTargetDropEvent dtde) {
if (dtde.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
dtde.acceptDrop(ACTION_COPY);
String trns = (String) dtde.getTransferable().getTransferData(DataFlavor.stringFlavor);
System.err.println("Dropped string "+trns);
Point loc = dtde.getLocation();
// Show a popup after the drop operation
JPopupMenu jpm2 = new JPopupMenu("Popup menu");
JMenuItem jmi2 = new JMenuItem("Popup option 1");
jpm2.add(jmi2);
System.err.println("About to show popup after drop at "+loc.getX()+","+loc.getY());
jpm2.show(jp, (int)loc.getX(), (int)loc.getY());
} catch (Exception ex) {
ex.printStackTrace();
}
return;
}
dtde.rejectDrop();
}
}, true);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(DNDTest::new);
}
}